package com.mexcad.db.connectors;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.mexcad.cripto.SHA256;
import com.mexcad.db.dto.CKUsuario;
import com.mexcad.db.dto.CatEsquemaCredito;
import com.mexcad.db.dto.Cliente;
import com.mexcad.db.dto.Usuario;
import com.mexcad.db.utils.ExceptionDB;
import com.mexcad.db.utils.HibernateUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class UsuarioConnector{

	private static Log logger = LogFactory.getLog(UsuarioConnector.class);
	
	public UsuarioConnector(){
		logger.debug("Instanciating ClienteConnector");
	}
	
	public static Usuario consultarUsuario(String login,String passwd ){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Usuario resultado=null;
		try{
			String query ="FROM Usuario where login='"+login+"' AND password='"+SHA256.codificaPasswordBase64(passwd.toCharArray())+"'";
			resultado=(Usuario)session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
		return resultado;
	}
	
	public static Usuario consultarUsuarioById(int id ){
		Session session = null;
		Usuario resultado=null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			String query ="FROM Usuario where ckUsuario.idUsuario="+id;
			resultado=(Usuario)session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
		return resultado;
	}
	
	public static List<Usuario> getAllUsuarios(){
		Session session = HibernateUtil.getSessionFactory().openSession();
		List <Usuario>lista=null;
		try{
			String query ="FROM Usuario";
			lista=session.createQuery(query).list();
			//System.out.println(lista);
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
		return lista;	
	}
	
	public static boolean existeUsuarioPorLogin(String login){
		Session session = null;
		Usuario usr=null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			String query ="FROM Usuario where login='"+login+"'";
			usr=(Usuario)session.createQuery(query).uniqueResult();
			//System.out.println(lista);
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
		if(usr != null)
			return true;
		else 
			return false;

	}
	
	public static   int getUltimoIdUsuario(){
		Session session = null;
		Integer folio=null;
		try{
			session = HibernateUtil.getSessionFactory().openSession();
			String query = "select max(ckUsuario.idUsuario) from Usuario ";
		
			folio = (Integer) session.createQuery(query).uniqueResult();
			session.close();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
		if(folio == null)
			return 0;
		else 
			return folio;

	}
	
	public static synchronized int guardaUsuario(Usuario usuario){
		Session session = null;
		Transaction transaction = null;
		
		try{
			
			 session = HibernateUtil.getSessionFactory().openSession();
			 transaction = session.beginTransaction();
			
			logger.debug("Querying Usuario");
			if(usuario.getCkUsuario().getIdUsuario() == 0){
				usuario.getCkUsuario().setIdUsuario(getUltimoIdUsuario()+1);
				usuario.setPassword(SHA256.codificaPasswordBase64(usuario.getPassword().toCharArray()));
			}
			usuario.setPassword(SHA256.codificaPasswordBase64(usuario.getPassword().toCharArray()));
			usuario.setNombres(usuario.getNombres().toUpperCase());
			usuario.setApellidoMaterno(usuario.getApellidoMaterno().toUpperCase());
			usuario.setApellidoPaterno(usuario.getApellidoPaterno().toUpperCase());
			usuario.setRfc(usuario.getRfc().toUpperCase());
			usuario.setGiro(usuario.getGiro().toUpperCase());
			
			session.saveOrUpdate(usuario);
			transaction.commit();

			session.close();
			
			
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
		return usuario.getCkUsuario().getIdUsuario();
		
		
	}

	public static synchronized void eliminaUsuario(int idUsuario) {
		Session session = null;
		Transaction transaction = null;
	
		try{		
			session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
			
			Usuario usr= consultarUsuarioById(idUsuario);
	
			session.delete(usr);
			transaction.commit();
		}catch(org.hibernate.exception.GenericJDBCException excepts){
			if(session!= null&& session.isOpen())
				session.close();
		}catch(Exception e){
			if(session!= null&& session.isOpen())
				session.close();
		} finally{
			if(session!= null&& session.isOpen())
				session.close();
			
		}
			
			session.close();
	}		
	
	public static void main(String []arg){
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = session.beginTransaction();
		
	//	String query = " from Gerente ";
	
		Usuario usr=consultarUsuarioById(1);
		usr.setPassword(SHA256.codificaPasswordBase64(usr.getPassword().toCharArray()));
		session.saveOrUpdate(usr);
		transaction.commit();
		//System.out.println(lista);
		session.close();
		
		
		String str="admin";
		//System.out.println(lista.size());
		//	session.close();
		//	System.out.println(lista);
		
		//	query ="FROM CatDepartamento";
		//	List <CatEsquemaCredito>lista2=session.createQuery(query).list();
		//	System.out.println(lista);
		
		
		
		
	}

}